Alexandre Casanovas - M2.959 PRA 1
Generem dos diferents paràmetres per a mesurar la conflictivitat:
- Un índex proporcional a la inversa de dies entre acords del mateix país = 1000/dies_entre_acords (l'índex de conflictivitat).
- La quantitat d'acords de pau del país en els trenta-dos anys de registre de la base de dades (no.d'acords_de_pau_signats).
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import datetime
import plotly.express as px
import plotly.graph_objects as go
import os
os.chdir("C:/Users/alx/Downloads/PAC3/pax-c")
os.getcwd()
'C:\\Users\\alx\\Downloads\\PAC3\\pax-c'
En la PRA3 es va obtenir de les dades de PA-X Peace Agreements Database un fitxer paxc2.csv
paxc3.csv es distingeix de paxc2.csv només en el fet que les dates estan ordenades, alguna cosa que Plotly sembla requerir a vegades:
paxc2=pd.read_csv('paxc3.csv',parse_dates = ["Data_de_firma"],index_col=["Data_de_firma"])
print(paxc2.shape)
paxc2.head(2)
(1464, 8)
| AgreementId | Region | Country | DaysInc | 1000/dies_entre_acords | Year | Month | no.d'acords_de_pau_signats | |
|---|---|---|---|---|---|---|---|---|
| Data_de_firma | ||||||||
| 1990-02-15 | 431 | Cross-regional | Argentina/United Kingdom | 2050.0 | 0.487805 | 1990 | 2 | 2 |
| 1990-01-03 | 295 | Asia and Pacific | Papua New Guinea/Bougainville | 157.0 | 6.369427 | 1990 | 3 | 139 |
os.getcwd()
'C:\\Users\\alx\\Downloads\\PAC3\\pax-c'
paxc3.xlsx es distingeix de paxc3.csv només en el fet que les etiquetes s'han simplificat, per tal d'evitar símbols com ', incompatibles amb alguna instrucció de Python.
paxc3=pd.read_excel("paxc3.xlsx")
paxc3.head(2)
| Data | AcordId | Region | Pais | DifDias | conf_index | Any | Mes | Acords_signats | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1990-02-15 | 431 | Cross-regional | Argentina/United Kingdom | 2050.0 | 0.487805 | 1990 | 2 | 2 |
| 1 | 1990-03-01 | 295 | Asia and Pacific | Papua New Guinea/Bougainville | 157.0 | 6.369427 | 1990 | 3 | 139 |
Hem creat un menú variat de visualitzacions de l'índex de conflictivitat.
1-bar plot interactiu per representar incidències de l'índex, per regions de la base de dades, on el color indica la contribució individual per país:
# bar plot
escalaTL = ['rgb(3, 252, 40)','rgb(255, 0, 0)'] # escala de color vert - roig
fig = px.bar(data_frame=paxc2,
y ='Region',
x='1000/dies_entre_acords',
title='Conflictivitat (nombres més grans, més conflictivitat)',
# color i escala
color='1000/dies_entre_acords',
color_continuous_scale = escalaTL
)
# show plot
fig.show()
fig.write_html("RegionBarH.html") # guardem la visualització
2-box plot interactiu, per veure els outliers i la distribució estadística de l'índex:
# box plot
fig = px.box(data_frame=paxc2,
x ='Region',
y='1000/dies_entre_acords',
title='Conflictivitat i outliers de conflictivitat',
# hover data per veure outliers
hover_data=['Country'],
color='Region')
# Show the plot
fig.show()
fig.write_html("RegionBox.html")
3-histograma de l'índex, per veure la seva distribució:
# histogram
fig = px.histogram(data_frame=paxc2,
# dies entre acords
x='1000/dies_entre_acords', #'DaysInc',
nbins=200,
# hover_data=['Country'],
log_y=True,
title='Distribució de conflictivitat (nombres més grans, més conflictivitat)')
# show plot
fig.show()
fig.write_html("IndexHisto.html")
4-scatter plot de totes de l'índex del conjunt de dades des de 1990 fins a 2021. Inclou escala logarítmica en l'índex perquè la majoria són valors molt baixos. Cita respecte a escales log, d'Alexandre Scriven:
"When visualizing data, you are telling a story.If your audience, e. g., doesn't know what a log scale is, there may be miscommunication. So remember to keep your audience in mind!"
# scatterplot
fig = px.scatter(data_frame=paxc2,
title="Conflictivitat global",
x=paxc2.index, y= '1000/dies_entre_acords',
hover_data=['Country'],
color='Region',
log_y=True,
size="no.d'acords_de_pau_signats",
opacity=0.6
)
# show plot
fig.show()
fig.write_html("IndexTots.html")
5-HeatMap de les correlacions entre variables:
# correlation table
pax_corr = paxc2.corr(method='pearson')
# correlation plot
fig = go.Figure(go.Heatmap(
z=pax_corr.values.tolist(),
x=pax_corr.columns,
y=pax_corr.columns,
colorscale='rdylgn',
zmin=-1, zmax=1))
# show plot
fig.show()
fig.write_html("CorrHeatMap.html")
6-bubble plot de l'índex, a la manera de Hans Rosling, animat i interactiu: es pot fixar l'any, o fer un recorregut des de 1990 fins a 2021:
fig=px.scatter(paxc2,
x="Month",
y="1000/dies_entre_acords",
animation_frame="Year",
animation_group="Year",
size="no.d'acords_de_pau_signats",
color="Region",
hover_name="Country",
log_y=True,
size_max=55,
range_x=[0,13],
range_y=[1,200]
)
fig.write_html("Display_animat.html")
fig.show()
7-Hi ha regressió lineal entre l'identificador de l'acord i la data? Segons la correlació de 0,591 del heatmap, hi ha una certa relació, però no és lineal:
# scatterplot
fig = px.scatter(data_frame=paxc2,
x=paxc2.index,
y='AgreementId',
color='Region',
hover_data=["1000/dies_entre_acords","no.d'acords_de_pau_signats"],
hover_name='Country',
title='Conflictivity')
# show plot
fig.show()
8-Com ha sigut la conflictivitat de cada dècada? Per a respondre a aquesta pregunta, hem fet un bar chart dels anys 1990, 2000,2010 i 2020
(a la gràfica apareixen com a trace 0 a trace 3) i veiem que hi ha pics de conflictivitat separats uns vint anys.
# crear la figura base 'fig'
fig = go.Figure()
# recorregut al llarg dels anys
for years in [1990,2000,2010,2020]:
# afegir bar-chart-trace
fig.add_trace(
go.Bar(
x=paxc3.Region,
y=paxc3.Mes[paxc3.Any == years]
)
)
# show fig
fig.show()
fig.write_html("4decades.html")
9-Introduïm en la interactivitat pestanyes que permeten comparar els vint anys anteriors, els 10 o 5 anys anteriors, o l'any anterior:
# Definir els botons
date_buttons = [
{'count': 22, 'label': '20YTD', 'step': "year", 'stepmode': "todate"},
{'count': 17, 'label': '10YTD', 'step': "year", 'stepmode': "todate"},
{'count': 7, 'label':'5YTD', 'step': "year", 'stepmode': "todate"},
{'count': 3, 'label':'YTD', 'step': "year", 'stepmode': "todate"}]
fig = px.scatter(data_frame=paxc3, x='Data', y='conf_index',
title="Index de conflictivitat",
color='Region',
hover_name="Pais",
size='Acords_signats',
log_y=True,
opacity=.65)
# Afegir botons i show
fig.update_layout(
{'xaxis':
{'rangeselector': {'buttons': date_buttons}}})
fig.show()
fig.write_html("4buttons.html")
10-Conflictivitat d'un país: en aquest cas, hem triat Colòmbia. Hem posat botons per comparar 20, 10 i 5 anys enrere:
paxc3Afg=paxc3[paxc3.Pais=="Colombia"] # triem dades de Colòmbia
# line chart
fig =px.line(data_frame=paxc3Afg, x='Data', y='conf_index', title="Index de conflictivitat de Colombia")
# definim els botons retrospectius
fin_buttons = [
{'count': 22, 'label': "20YTD", 'step': 'year', 'stepmode': 'todate'},
{'count': 12, 'label': "10YTD", 'step': 'year', 'stepmode': 'todate'},
{'count':7, 'label': "5YTD", 'step': 'year', 'stepmode': 'todate'}
]
# fixar els botons i show plot
fig.update_layout({'xaxis': {'rangeselector': {'buttons': fin_buttons}}})
fig.show()
fig.write_html("Conf_Colombia.html")
11-bar plot interactiu dels 30 països d'índex de conflictivitat major que 100, per regions:
# seleccionar els països d'índex > 100
mes30=paxc2[paxc2["1000/dies_entre_acords"]>100]
mes30.head()
| AgreementId | Region | Country | DaysInc | 1000/dies_entre_acords | Year | Month | no.d'acords_de_pau_signats | |
|---|---|---|---|---|---|---|---|---|
| Data_de_firma | ||||||||
| 1991-06-06 | 166 | Americas | Colombia | 9.0 | 111.111111 | 1991 | 6 | 106 |
| 1992-06-06 | 1589 | Europe and Eurasia | Bosnia and Herzegovina/Yugoslavia (former) | 9.0 | 111.111111 | 1992 | 6 | 68 |
| 1992-12-13 | 1615 | Europe and Eurasia | Bosnia and Herzegovina/Yugoslavia (former) | 9.0 | 111.111111 | 1992 | 12 | 68 |
| 1993-08-01 | 567 | Africa (excl MENA) | Somalia | 7.0 | 142.857143 | 1993 | 1 | 146 |
| 1993-06-15 | 1627 | Europe and Eurasia | Bosnia and Herzegovina/Yugoslavia (former) | 8.0 | 125.000000 | 1993 | 6 | 68 |
# bar plot
fig = px.bar(data_frame=mes30,
y ='Country',
x='1000/dies_entre_acords',
title='Conflictivitat i outliers de conflictivitat, 30 destacats',
# hover data per veure outliers
hover_data=['Country'],
color='Region')
# show plot
fig.show()
fig.write_html("30DestBox.html")